package com.piggy.logi.sys.service;


import com.piggy.common.core.web.base.BaseResponse;
import com.piggy.common.core.web.page.IServicePlus;
import com.piggy.common.core.web.page.TableDataInfo;
import com.piggy.logi.sys.bo.*;
import com.piggy.logi.sys.domain.LogiWaybill;
import com.piggy.logi.sys.enums.WaybillStatusEnum;
import com.piggy.logi.sys.vo.LogiWaybillExtVo;

import java.util.List;

/**
 * 运单信息Service接口
 */
public interface ILogiWaybillService extends IServicePlus<LogiWaybill>, BaseResponse {
    public void fillDate(List<LogiWaybillExtVo> waybillList);

    /**
     * 查询单个
     *
     * @return
     */
    LogiWaybillExtVo queryById(Long id);

    /**
     * 查询列表
     */
    TableDataInfo<LogiWaybillExtVo> queryPageList(LogiWaybillQueryBo bo);

    /**
     * 查询列表
     */
    List<LogiWaybillExtVo> queryList(LogiWaybillQueryBo bo);

    /**
     * 根据新增业务对象插入运单信息
     *
     * @param bo 运单信息新增业务对象
     * @return
     */
    LogiWaybillExtVo insertByAddBo(LogiWaybillEditExtBo bo);

    /**
     * 根据编辑业务对象修改运单信息
     *
     * @param bo 运单信息编辑业务对象
     * @return
     */
    Boolean updateByEditBo(LogiWaybillEditExtBo bo);

    /**
     * 运单操作
     */
    void operateWaybill(Integer type, Long waybillId);

    /**
     * 校验并删除数据
     *
     * @param id      主键
     * @param isValid 是否校验,true-删除前校验,false-不校验
     * @return
     */
    Boolean deleteWithValidById(Long id, Boolean isValid);

    /**
     * 运营管理-查询待发车运单列表
     */
    TableDataInfo<LogiWaybillExtVo> dispatchList(OperationDispatchQueryBo queryBo);

    /**
     * 运营管理-装车
     */
    void load(List<Long> waybillIds, Long loadId, Integer type);

    /**
     * 运营管理-取消装车
     */
    void cancelLoad(Long loadId, Integer type);

    /**
     * 运营管理-发车
     */
    void depart(String scheduleNo);

    /**
     * 运营管理-取消发车
     */
    void cancelDepart(String scheduleNo);

    /**
     * 运营管理-到达
     */
    void arrived(String scheduleNo);

    /**
     * 运营管理-取消到达
     */
    void cancelArrived(String scheduleNo);

    /**
     * 运营管理-取消到达
     */
    boolean checkWaybillSign(String scheduleNo);

    /**
     * 运营管理-库存列表
     */
    TableDataInfo<LogiWaybillExtVo> stockList(OperationStockQueryBo queryBo);

    /**
     * 运营管理-回单列表
     */
    TableDataInfo<LogiWaybillExtVo> receiptList(OperationReceiptQueryBo queryBo);

    /**
     * 运营管理-添加回单
     */
    void receipt(OperationReceiptBo receiptBo);

    /**
     * 根据编辑业务对象修改运单信息
     *
     * @return
     */
    Boolean updateStatus(Long waybillId, Integer status);

    /**
     * 根据编辑业务对象修改运单信息
     *
     * @return
     */
    Boolean updateScheduleStatus(String scheduleNo, Integer scheduleStatus);

    Boolean updateScheduleStatusByBillId(Long waybillId, Integer scheduleStatus);

    Boolean cancelScheduled(Long waybillId);

    Boolean updateDrayageStatusByBillId(Long waybillId, Integer drayageStatus);

    Boolean updateDrayageStatus(String drayageNo, Integer drayageStatus);

    /**
     * 检查调度下面的运单是否都一致,如果一致，则修改调度状态
     */
    void checkAndUpdateStatus(String scheduleNo, WaybillStatusEnum billStatus);
    /**
     * 检查调度下面的运单是否都一致,如果一致，则修改调度状态
     */
    void checkAndUpdateStatus(List<String> scheduleNos, WaybillStatusEnum billStatus);

    Boolean completed(Long waybillId);

    /**
     * 查询符合条件已完成的运单（平台用户查看所有）
     **/
    List<LogiWaybill> getCompletedWaybills(Long deptId, String startDate, String endDate);
}
